'Motor principal del juego
MotorJ()
STOP

#DEFINE TTmin 18
#DEFINE TTmax 36
#DEFINE PX 0
#DEFINE PY 1
#DEFINE PUNTPX 2
#DEFINE PUNTPY 3
#DEFINE ORI 4
#DEFINE O2 5
#DEFINE SUIT 6
#DEFINE CRYSTALS 7
#DEFINE OB1 8
#DEFINE OB2 9
#DEFINE OB3 10
#DEFINE POTSALTO 11
#DEFINE EXTRACC 12

#DEFINE PEX 1
#DEFINE PEY 2
#DEFINE ECLASS 3
#DEFINE AVX 4
#DEFINE AVY 5

#DEFINE PXI 1
#DEFINE PYI 2
#DEFINE PXF 3
#DEFINE PYF 4

#INCLUDE once "VarComp.bas"
#INCLUDE once "Datos.bas"
#INCLUDE once <putchars.bas>
#INCLUDE once <attr.bas>
#INCLUDE once <keys.bas>
#INCLUDE once <memcopy.bas>
#INCLUDE once "utils/muthur.bas"
#INCLUDE once "Sonido.bas"


Dim colMarc(1,2) As UBYTE=> {_
{1,5,7},_
{2,6,4}_
}

Dim vivo As UBYTE
Dim moviendo As UByte
Dim mov As UByte
Dim x, y As UByte
Dim frame, frameP, frameS, subFrameP As UByte
Dim frameA As UBYTE
Dim frameE1 As UBYTE
Dim sx, sy As UByte
Dim suelo As UBYTE
Dim objeto As UBYTE
Dim orientacion As Byte
Dim avanceX,avanceY As UByte
Dim tyy As UByte
Dim tilexy As UByte
Dim offsetX As UByte
Dim offsetY As UByte
Dim avanceSalto As UByte
Dim iterSalto As UByte
Dim limSubFrame As UBYTE
Dim contEspera As UBYTE
Dim n As UBYTE
Dim agachado As UBYTE
Dim pintado As UBYTE
Dim maxMarc As UBYTE
Dim h1,h2,h3,h4,v1,v2 As UBYTE

Dim danyofrecacu As UBYTE
Dim danyofrecacuo2 As UINTEGER

'nuevas mejora
DIM contmovd AS UBYTE = 0
DIM contmovi AS UBYTE = 0
DIM contmovs AS UBYTE = 0
DIM tmp AS UINTEGER 'para todo


#INCLUDE once <PutChars.bas>
#INCLUDE once "FuncPantallas.bas"
#INCLUDE once <attr.bas>
#INCLUDE once "Enemigos.bas"
#INCLUDE once "PanelUtils.bas"

'Función Principal
Sub MotorJ()
    n=0
    danyofrecacu=0
    danyofrecacuo2=0
    IniciaPartida()
    Juego()
    If ending=1
        SilenciarAY()
        calculaPorc()
        muthur(2,1,1): pause 100: muthurClear(0)
        MODRun=MOD_MEN
    Else If ending=2
        calculaPorc()
        MODRun=MOD_MEN
    Else
        MODRun=MOD_CRY
        DatosJ(jugador,PX)=x
        DatosJ(jugador,PY)=y
        DatosJ(jugador,ORI)=orientacion
    End If
END Sub

'Recoloca los objetos del mapa al empezar cada partida
Sub iniciaObjetos()
    For p=0 To ubound(Objets,1)
        Pantallas(Objets(p,0),Objets(p,1)*16+Objets(p,2))=Objets(p,3)
    Next p
END Sub

'Configura el inicio de partida
Sub IniciaPartida()
    Dim p,jugadorold As UBYTE
    x=DatosJ(jugador,PX)
    y=DatosJ(jugador,PY)
    pantalla=Conex(DatosJ(jugador,PUNTPY),DatosJ(jugador,PUNTPX))
    orientacion=DatosJ(jugador,ORI)
    frame=0: frameP = 0: subFrameP=0: limSubFrame=254
    frameE1=0
    frameA=0
    vivo=1
    maxMarc=48
    
    jugadorold=jugador
    jugador=1: muestraItem(4,0)
    jugador=0: setAttr(bP+2,1,57+jugador*2+128)
    jugador=jugadorold
    
    'jmm quitar!!
    'jugador=1
    'jmm
    
    moviendo=0
    pintado=0
    iterSalto=0
    avanceX=1
    avanceY=1
    agachado=0
    
    'jmm
    mov=4
    moviendo=1
    
    If ending=3
        If CCFail=1
            snd128(5)
            For jugadorold=0 To 3
                BajaMarc(5,1):pause 10
            Next jugadorold
        Else
            PrintCharFall(6,14+jugador*3,1)
            checkExtraeEnergia()
            Dim o1,o2 As UBYTE
            For p=0 To ubound(Objets,1)-1
                If Objets(p,0)=pantalla
                    If Objets(p,3)=4
                        o2=Objets(p,2)*2
                        o1=Objets(p,1)*2
                        CambiaTile(pantalla,o2,o1,0)
                        PutChars(o2,o1+2,2,2,@tiles(0,0))
                        PaintData(o2,o1+2,2,2,@tiles_attr(0,0))
                    End If
                End If
            Next p
        End If
        
        CambiaPantalla(0,0)
        setAttr(bP+2,1+((jugador+1)mod 2)*29,57+((jugador+1)mod 2)*2)
    Else 'Primera vez que se entra (ending=1)
        PRINT USR INIENEM
        energized=0
        iniciaObjetos()
        CambiaTile(47,6,6,0)
        CambiaTile(25,27,12,0)
        SubeMarc(0,DatosJ(0,O2),0): SubeMarc(1,DatosJ(1,O2),0)
        SubeMarc(0,DatosJ(0,SUIT),1): SubeMarc(1,DatosJ(1,SUIT),1)
        imprPant2()
    End If
    
    suelo=1: contmovs=5
    ending=1
END Sub


'Comprueba si tenemos 4 cristales para energizar llave
Sub checkExtraeEnergia()
    Dim i,cant As UByte
    If DatosJ(jugador,CRYSTALS)>=4 And DatosJ(jugador,OB2)>0
        If DatosJ(jugador,OB1)>0
            For i=0 To 3
                PrintCharFall(6,14+jugador*3,-1)
            Next i
            
            cant=10+jugador*10
            setAttr(bP+1,cant,130)
            setAttr(bP+1,cant+1,131)
            setAttr(bP+2,cant,131)
            setAttr(bP+2,cant+1,195)
            energized=1
            muthur(jugador,1,11): pause 100
        Else
            muthur(2,1,13): pause 100
        End If
    End If
END Sub

'Registra pantalla visitada y la muestra
Sub imprPant2()
    RVisit(pantalla)=1
    PRINT USR IMPRPANT
    ink 7:PrintChar(1,0,Code("."),16384,0)
END Sub

Sub pausa()
    waitretrace
END Sub

'Función principal
Sub Juego()
    While vivo
        reloj=reloj+1
        
       ' If moviendo = 0 And mov<>3 'parche frame=0, solo hace la anim cuando frame=0 y no está en mitad de 4bit
           ' IF frame=0 'lo separo el AND y lo pongo en otra fila porque si no, nunca visualizaría frame=1
              '  imprJugParado()
            'END IF
       ' Else
        if moviendo=1 OR mov=4
            imprJugMov()
        End If
        
       ' If mov<>3 and moviendo=1
        '    If jugador=0
         '       putChars(x+(orientacion>0),y+1,1,1,@Matt_lars2(frame+orientacion+1,0))
         '   End If
            'JMM quitar color
           ' paint(x+(orientacion>0),y+1,1,1,15+(jugador*16))
       ' End If
        
        If mov<>2 and mov<>4
            teclado()
        End If
        
        danyofrecacuo2=danyofrecacuo2+1
        If danyofrecacuo2>=CAST(UINTEGER,danyofreco2)*100
            danyofrecacuo2=0
            BajaMarc(danyo,0)
        End If
        
        If reloj mod 10 = 0
            anima()
            frameE1=frameE1+1
            mueveEnemigo(0)
            mueveEnemigo(1)
            
            h4=ObtenerTile(pantalla,x+(orientacion>0),y+3)
            If h4=7 Or h4=15 Or v1=7 Or v1=15
                damage()
            End If
        End If
    WEND
END Sub

'Detecta pulsación de botón
Sub btnPressed(activa As UBYTE)
    Dim i As UBYTE
    For i=0 To 9
        If pantalla=gate(i,0)
            switchGate(gate(i,1),gate(i,2),activa)
            exit for
        End If
    Next i
END Sub

'Activa/Desactiva una puerta determinada
Sub switchGate(xx As UBYTE, yy As UBYTE, activa As UBYTE)
    Dim i,tileold,tile As UBYTE
    tileold=ObtenerTile(pantalla,xx,yy)
    If activa=0
        tile=18
        snd128(0)
    Else
        tile=30
        snd128(1)
    End If
    For i=0 To 2
        CambiaTile(pantalla,xx,(i*2)+yy-2,tile)
        PutChars(xx,(i*2)+yy,2,2,@tiles(tile,0))
        PaintData(xx,(i*2)+yy,2,2,@tiles_attr(tile,0))
    Next i
    For i=0 To nanim
        If anim(i,2)=tileold
            anim(i,2)=tile
        End If
    Next i
end Sub

'Anima los tiles animados de la pantalla actual
Sub anima()
    Dim i,tile,x,y As UBYTE
    Dim f2m2 As UBYTE
    If nanim>0
        frameA=frameA+1
        f2m2=frameA mod 2
        For i=0 To nanim
            tile=anim(i,2)
            x=anim(i,0):y=anim(i,1)
            If tile=7
                imprTileParcialFila(x,y,tile,f2m2)
                imprTileParcialFila(x,y+1,tile,f2m2)
            Elseif tile=6
                imprTileParcialFila(x,y,tile,stars(frameA mod 100,0) mod 2)
                imprTileParcialFila(x,y+1,0,0)
            Else If tile=17
                paint(x,y,1,2,76+(f2m2)*128)
                paint(x+1,y,1,2,12+(f2m2)*128)
            Elseif tile=30
                paint(x,y,2,2,2*(f2m2))
            Elseif tile=45 Or tile=10
                paint(x,y,2,2,1+(f2m2)*4)
            Elseif tile=46
                paint(x,y,2,2,2+(f2m2))
            Elseif (tile>35 And tile<40) Or tile=14 Or tile=26 Or tile=29
                paint(x,y,1,1,15+(f2m2)*64)
                paint(x+1,y+1,1,1,15+(f2m2)*64)
            Elseif (tile>39 And tile<47)
                paint(x,y,2,2,(frameA mod 7)+1)
            Else If tile=4 or tile=47
                paint(x,y,2,2,4+(f2m2)*64)
            Else If tile=9
                paint(x+1,y,1,1,2+(f2m2)*64)
            Else If tile=13
                paint(x,y,1,1,2+(f2m2)*64)
            End If
        Next
    End If
END Sub

'Detecta si hay un objeto interactivo al agacharnos
Sub activarObjeto()
    Dim i,j As UBYTE
    v1=ObtenerTile(pantalla,x,y+ALTO-1)
    v2=ObtenerTile(pantalla,x+1,y+ALTO-1)
    If v1=v2
        If v1>=36 And v1<=47
            CambiaTile(pantalla,x,y,0)
            snd128(4)
            fan(4,0,0)
            fan(4,0,1)
            fan(4,1,0)
            fan(4,1,1)
            SilenciarAY()
        End If
        
        If v1>=36 And v1<=39
            muthur(2,1,4+v1-36): pause 100: muthurClear(1)
        Else If v1>=40 And v1<=43
            muestraItem(v1-40,1)
            checkExtraeEnergia()
        End If
        
        If v1=4
            If DatosJ(jugador,EXTRACC)>5
                ending=3: vivo=0
            Else
                muthur(2,1,8): pause 100
            End If
        Else If v1=36
            setAttr(bP+1,3,%1000001)
            muthur(0,0,14): pause 80
            For i=15 To 21
                muthur(1,0,i): pause 40
                IF Multikeys(KEYF)
                    exit for
                end if
                pause 40
            Next i
            
            muthurClear(1)
            muthur(1,1,24): pause 80
            DatosJ(0,EXTRACC)=DatosJ(0,EXTRACC)+1
            'SilenciarAY() 'pequeño bug sonid
        Else If v1=37
            setAttr(bP+2,3,%1000001)
            DatosJ(0,POTSALTO)=5
        Else If v1=38
            setAttr(bP+1,4,%1000001)
            DatosJ(0,EXTRACC)=DatosJ(0,EXTRACC)+2
        Else If v1=39
            setAttr(bP+2,4,%1000001)
            DatosJ(0,EXTRACC)=DatosJ(0,EXTRACC)+4
        Else If v1=44
            muestraItem(4,0)
            checkExtraeEnergia()
        Else If v1=45
            SubeMarc(jugador,maxMarc,0)
        Else If v1=46
            SubeMarc(jugador,maxMarc,1)
        Else If v1=47
            muestraItem(7,2)
            vivo=0: ending=2
        Else If v1=14
            
            If DatosJ(jugador,OB2)>0 And energized=1
                If (pantalla=36 And DatosJ(jugador,OB2)=40) _
                    Or (pantalla=6 And DatosJ(jugador,OB2)=41) _
                    Or (pantalla=34 And DatosJ(jugador,OB2)=42)_
                    Or (pantalla=9 And DatosJ(jugador,OB2)=43)
                    energized=0
                    btnPressed(0)
                Else
                    muthur(2,1,12)
                End If
            Else
                muthur(2,1,12)
            End If
        End If
        
        For i=0 To nanim
            If anim(i,2)=v1
                anim(i,2)=0
            End If
        Next
    End If
    
    v1=ObtenerTile(pantalla,x,y+ALTO)
    v2=ObtenerTile(pantalla,x+1,y+ALTO)
    If v1=26 And v1=v2
        If DatosJ(jugador,OB2)>0
            If pantalla=25
                CambiaTile(47,6,6,DatosJ(jugador,OB2))
                Objets(ubound(Objets,1),0)=47
                Objets(ubound(Objets,1),1)=6/2
                Objets(ubound(Objets,1),2)=6/2
                limpiaeinforma()
            Else
                CambiaTile(25,27,12,DatosJ(jugador,OB2))
                Objets(ubound(Objets,1),0)=25
                Objets(ubound(Objets,1),1)=12/2
                Objets(ubound(Objets,1),2)=27/2
                limpiaeinforma()
            End If
        Else
            muthur(jugador,1,10)
        End If
    End If
END Sub

'Coge el objeto de la pantalla e informa
Sub limpiaeinforma()
    Objets(ubound(Objets,1),3)=DatosJ(jugador,OB2)
    muthur(jugador,1,9)
    DatosJ(jugador,OB2)=0
    PutChars(10+jugador*10,bP+1,2,2,@tiles(0,0))
    PaintData(10+jugador*10,bP+1,2,2,@tiles_attr(0,0))
    pause 100: muthurClear(1)
END Sub

'Hace la animación de espera del jugador
Sub imprJugParado()
    subFrameP = subFrameP + 1
    If subFrameP > limSubFrame
        subFrameP=0
        frameP=frameP + 1
        limSubFrame=50
        pintado=0
        If frameP>2
            contEspera=contEspera+1
            frameP=1
        End If
        If contEspera>5
            contEspera=0: frameP = 0: limSubFrame=254
            pintado=0
        End If
    End If
    If pintado=0
        pintado=1
        pausa()
        tmp=abs(orientacion-1)*320
        putCharsOverMode(x+frame,y,ANCHO,ALTO,3,@Matt_parado_der_mask(frameP,0)+tmp)
        pausa()
        putCharsOverMode(x+frame,y,ANCHO,ALTO,2,@Matt_parado_der(frameP,0)+tmp)
    End If
END Sub



'Gestiona el movimiento del jugador
Sub imprJugMov()
    Dim muro,xmuro As UBYTE
    Dim floor1,floor2 As UBYTE
    Dim tiletmp,tiletmp2,tiletmp3 As UBYTE
    offsetX=x bAND %1: offsetY=y bAND %1
    
    If mov < 2
        xmuro=x-1+3*mov
        h1=ObtenerTile(pantalla,xmuro,y)
        h4=ObtenerTile(pantalla,xmuro,y+3)
        v1=ObtenerTile(pantalla,x,y+ALTO)
        v2=ObtenerTile(pantalla,x+1,y+ALTO)
        muro=(h1>TTmin And h1<TTmax) Or (h4>TTmin And h4<TTmax)
        moviendo=not(muro)
        suelo=(v1>TTmin And v1<TTmax) Or (v2>TTmin And v2<TTmax) And Not(y=maxY)
        
        
        If h4=10
            h4=ObtenerTile(pantalla,xmuro+1,y+3)
            btnPressed(0)
        End If
        If h1=59
            If pantalla=19 Or pantalla=31 Or pantalla=32 Or pantalla=21 Or pantalla=22
                btnPressed(1)
            End If
        End If
        
    End If
    
    If mov = 0
        If orientacion=-1 And Not(muro) And x>=minX+1 
            imprTileFondo()
            IF frame = 1
                x=x-1
                frame=0
            ELSE
                frame = 1
            END IF
            
             tiletmp=ObtenerTile(pantalla,x,y+ALTO)
            tiletmp2=ObtenerTile(pantalla,x-1,y+ALTO)
        If (tiletmp <= TTmin Or tiletmp >= TTmax) _
            And ( tiletmp2<= TTmin Or tiletmp2 >= TTmax) 
                mov=4
            Else

            'Sonido nuevo'
           '' fxs(7,2)=100*frame
                fxs(7,12)=6+frame*4
    snd128(7)

            pausa()
            putCharsOverMode(x-1,y,ANCHO+1,ALTO,3,@Matt_camina_izq_mask(frame,0)) 'Cuando frame=0, ANCHO es 3, f=1 ANCHO es 2
            pausa()
            putCharsOverMode(x-1,y,ANCHO+1,ALTO,2,@Matt_camina_izq(frame,0))
                moviendo = 0 : suelo=1
            End If
        Elseif orientacion=1
            imprFondoInt()
            imprTileFondo()
            pausa()
            putCharsOverMode(x,y,ANCHO,ALTO,3,@Matt_parado_izq_mask(frameP,0)) 'añadido x+frame-1, cuando frame=0 x-1, frame=1 pinta en mismo sitio
            pausa()
            putCharsOverMode(x,y,ANCHO,ALTO,2,@Matt_parado_izq(frameP,0))
            orientacion=-1: moviendo=0+Not(suelo)

            frame=0
           
        Elseif Not(suelo) Or agachado=1
            mov=4
            agachado=0
        Elseif x<minX+1
            CambiaPantalla(-1,0)
        End If
        
    Elseif mov = 1
        If orientacion=1 And Not(muro) And (x<=maxX-2)
            imprTileFondo()
            
            IF frame = 1
                x=x+1
                frame=0

            ELSE
                frame = 1
            END IF
   
            tiletmp=ObtenerTile(pantalla,x,y+ALTO) 'he añadido x+1 para que pinte bien frame, pero da error enc aida
            tiletmp2=ObtenerTile(pantalla,x+1,y+ALTO)
        If (tiletmp <= TTmin Or tiletmp >= TTmax) _
            And ( tiletmp2<= TTmin Or tiletmp2 >= TTmax) 
            
                mov=4
            Else
            'Sonido nuevo'
            fxs(7,12)=6+frame*4
            snd128(7)

            pausa()
            putCharsOverMode(x,y,ANCHO+frame,ALTO,3,@Matt_camina_der_mask(frame,0)) 'Cuando frame=0, ANCHO es 2, f=1 ANCHO es 3
            pausa()
            putCharsOverMode(x,y,ANCHO+frame,ALTO,2,@Matt_camina_der(frame,0))
            
            moviendo = 0 : suelo=1
            End If
            
        Elseif orientacion=-1
          imprFondoInt()
          
            imprTileFondo()
            pausa()
            putCharsOverMode(x,y,ANCHO,ALTO,3,@Matt_parado_der_mask(frameP,0)) 'Añadido x-frame, cuando frame=0 no afecta, frame=1 pinta en -1
            pausa()
            putCharsOverMode(x,y,ANCHO,ALTO,2,@Matt_parado_der(frameP,0))
            orientacion=1: moviendo=0+Not(suelo)
            
            frame=0
            
        Elseif Not(suelo) Or agachado=1
            mov=4
            agachado=0
        Elseif x+2>maxX
            CambiaPantalla(1,0)
        End If
    Elseif mov = 2
        If orientacion=-1
            h1=ObtenerTile(pantalla,x+1*orientacion,y)
            h4=ObtenerTile(pantalla,x+1*orientacion,y+3)
        Else
            h1=ObtenerTile(pantalla,x+2,y)
            h4=ObtenerTile(pantalla,x+2,y+3)
        End If
        
        If (h1<=TTmin Or h1>=TTmax)
            If iterSalto > 0
                iterSalto = iterSalto - 1
                sx=x+avanceX*orientacion
                if sx>32  
                    sx=0
                END IF
                If iterSalto > 0
                        fxs(7,12)=6+frame*4
                        snd128(7)
                    If sy>2
                        sy=sy-avanceY
                    Else
                        h2=ObtenerTile(pantalla-12,x,16)
                        If (h2<=TTmin Or h2>=TTmax) And pantalla>11
                            CambiaPantalla(0,-1)
                            iterSalto=3
                        End If
                    End If
                Else
                    mov=4
                End If
                avanceSalto=sx+1*orientacion
                If orientacion=-1
                    avanceSalto=avanceSalto+1
                End If
                
                If sx>maxX-1
                    sx=minX
                    CambiaPantalla(1,0)
                    moviendo=1
                    iterSalto=0
                Else If sx<minX
                    sx=maxX
                    CambiaPantalla(-1,0)
                    moviendo=1
                    iterSalto=0
                End If
                
                If iterSalto>0
                    fxs(7,12)=6+frame*4
                    snd128(7)
                    imprTileFondoTipoDiagonal()
                    x=sx: y=sy
                    v1=ObtenerTile(pantalla,x,y+ALTO-1)
                    v2=ObtenerTile(pantalla,x+1,y+ALTO-1)
                    If (v1>TTmin And v1< TTmax) Or (v2>TTmin And v2<TTmax)
                        x=x-orientacion
                    End If
                    
                    pausa()
                    tmp=abs(orientacion-1)*708
                    putCharsOverMode(x,y,ANCHO,ALTO,3,@Matt_saltando_der_mask(frameS,0)+tmp)
                    pausa()
                    putCharsOverMode(x,y,ANCHO,ALTO,2,@Matt_saltando_der(frameS,0)+tmp)
                Else
                    offsetY=y bAND %1
                    y=y-offsetY
                    imprTileFondo()
                    snd(50)
                    If iterSalto=4
                        mov=orientacion>0
                    Else
                        mov=4
                    End If
                End If
            End If
        Else
            mov = 4
        End If
    Elseif mov = 3 And pintado=0 And Not agachado
        imprFondoInt()
        imprTileFondo()
        tmp=abs(orientacion-1)*48
        putCharsOverMode(x,y+1,ANCHO,3,3,@Matt_frog_der_mask+tmp)
        putCharsOverMode(x,y+1,ANCHO,3,2,@Matt_frog_der+tmp)
        moviendo=0
        pintado=1
        agachado=1
        activarObjeto()
    End If
    
   
    If mov < 3
        agachado=0
    End If
    
    If mov = 4
        suelo=0
        offsetX=x bAND %1
        tiletmp=ObtenerTile(pantalla,x,y+ALTO)
        tiletmp2=ObtenerTile(pantalla,x+1,y+ALTO)
        If (tiletmp <= TTmin Or tiletmp >= TTmax) _
            And ( tiletmp2<= TTmin Or tiletmp2 >= TTmax) And y<maxY
            imprTileFondoCaida(x,y)
            y=y+1
            pause 1
            fxs(7,12)=6+frame*4
            snd128(7)

            frameS=(frameS+1) mod 2
            pausa()
            tmp=abs(orientacion-1)*708
            putCharsOverMode(x,y,ANCHO,ALTO,3,@Matt_saltando_der_mask(frameS,0)+tmp)
            pausa()
            putCharsOverMode(x,y,ANCHO,ALTO,2,@Matt_saltando_der(frameS,0)+tmp) '836
        Else
            SilenciarAY()
            suelo=1
            contmovs=0
            mov = 10:  moviendo = 0
            If (y bAND %1 = 1)
                y=sy-1
            End If
            
            
            imprTileFondoCaida(x,y)
            imprTileFondoCaida(x,y+2)
            
            
            If y<maxY
                pausa()
               tmp=abs(orientacion-1)*320
                putCharsOverMode(x,y,ANCHO,ALTO,3,@Matt_parado_der_mask(frameS,0)+tmp)
                pausa()
                putCharsOverMode(x,y,ANCHO,ALTO,2,@Matt_parado_der(frameS,0)+tmp)
            Else
                CambiaPantalla(0,1)
            End If
        End If
    End If
    
    IF mov <> 3 and jugador = 1 
        putChars(x+(orientacion>0),y+1,1,1,@Matt_lars2(frame+orientacion+1,0))
       IF mov>3 then 
        putChars(x+(orientacion>0),y+1,1,1,@Matt_lars2(orientacion+1,0))
    END if
        
    END IF

    frameS = frame bAND %1
    limSubFrame=254
END Sub

'Imprime fondo intermedio cuando estamos en frame 1
SUB imprFondoInt()
        IF frame=1
            x=x+2*orientacion
            imprTileFondo()
            x=x-2*orientacion
        END IF
END SUB

'Imprime fondo del jugador (tile actual)
Sub imprTileFondo()
    Dim i As UBYTE
    For i=0 To 1
        tyy=y+i*2+offsetY
        tilexy=ObtenerTile(pantalla,x,tyy)
        IF tilexy<>32 'para que no intente repintar donde están las naves
            If offsetX=0
                PutChars(x,tyy,2,2,@tiles(tilexy,0))
                PaintData(x,tyy,2,2,@tiles_attr(tilexy,0))
            Else
                imprTileParcial(x,tyy,tilexy,1)
                tilexy=ObtenerTile(pantalla,x+1,tyy)
                imprTileParcial(x+1,tyy,tilexy,0)
            End If
        ELSE
          IF pantalla=25
            PutChars(2,12,1,4,@tiles(0,0)) 'parche
          END IF
        END if
    Next
END Sub

'Imprime tile pero de forma parcial (izq/der)
Sub imprTileParcial(tx As UByte, ty As UByte, tilexy As UBYTE, lado As UBYTE)
    PutChars(tx,ty,1,2,@tiles(tilexy,16*lado))
    PaintData(tx,ty,1,1,@tiles_attr(tilexy,lado))
    PaintData(tx,ty+1,1,1,@tiles_attr(tilexy,lado+2))
END Sub

'Imprime tile pero de forma parcial (arr/aba)
Sub imprTileParcialFila(tx As UByte, ty As UByte, tilexy As UBYTE, lado As UBYTE)
    PutChars(tx,ty,1,1,@tiles(tilexy,8*lado))
    PutChars(tx+1,ty,1,1,@tiles(tilexy,16+8*lado))
    PaintData(tx,ty,1,1,@tiles_attr(tilexy,lado+1))
    PaintData(tx+1,ty,1,1,@tiles_attr(tilexy,lado*2+1))
END Sub

'Imprime tile al caer el jugador
Sub imprTileFondoCaida(x As UBYTE, y As UBYTE)
    tyy=y-offsetY
    tilexy=ObtenerTile(pantalla,x,tyy)
    If offsetX=0
        PutChars(x,tyy,2,2,@tiles(tilexy,0))
        PaintData(x,tyy,2,2,@tiles_attr(tilexy,0))
    Else
        imprTileParcial(x,tyy,tilexy,1)
        tilexy=ObtenerTile(pantalla,x+2,tyy)
        imprTileParcial(x+1,tyy,tilexy,0)
        border 0
    End If
END Sub

'Imprime tile en diagonal
Sub imprTileFondoTipoDiagonal()
    Dim i,txx As UByte
    Dim paso As Byte
    txx=x
    tyy=y
    paso=2
    For i=0 To 1+offsetY
        tyy=y+(paso*i)-offsetY
        If offsetX=0
            tilexy=ObtenerTile(pantalla,txx,tyy)
            PutChars(x,tyy,2,2,@tiles(tilexy,0))
            PaintData(x,tyy,2,2,@tiles_attr(tilexy,0))
        Else
            tilexy=ObtenerTile(pantalla,txx,tyy)
            imprTileParcial(txx,tyy,tilexy,1)
            tilexy=ObtenerTile(pantalla,txx+1,tyy)
            imprTileParcial(txx+1,tyy,tilexy,0)
        End If
    Next
END Sub

'Calcula porcentaje de pantallas visitadas
Sub calculaPorc()
    Dim i,suma As UBYTE
    suma=0
    For i=0 To PANTALLAS_MAX
        If RVisit(i)=1
            suma=suma+1
        End If
    Next
    If INT(suma/5) > experience
        experience= INT(suma/5)
    End If
    porc=suma*2
END Sub

'Función de gestión de teclado y joysticks
Sub teclado()
    If TipoControl=3
        n = IN(31)
    End If
    If GetKeyScanCode() <> 0 Or n>0
        If (n bAND %10) Or Multikeys(Teclas(0)) And mov<>2 And mov<>4 
        ' JMM
            if contmovi=5
                mov = 0 : moviendo = 1
                contmovi=0
            ELSE
                contmovi=contmovi+1
                contmovs=contmovs+1
            end if
        Elseif (n bAND %1) Or Multikeys(Teclas(1)) And mov<>2 And mov<>4
            if contmovd=5
                mov = 1 : moviendo = 1
                contmovd=0
            ELSE
                contmovd=contmovd+1
                contmovs=contmovs+1
            end if
        Elseif (n bAND %1000) Or Multikeys(Teclas(2)) And mov<>2 And mov<>4
            if contmovs>=5
                mov = 2 : moviendo = 1 : iterSalto = DatosJ(jugador,POTSALTO):  sx=x: sy=y: avanceX=1: avanceY=1: suelo=0
            ELSE
                contmovs=contmovs+1
            end if
        Elseif (n bAND %100) Or Multikeys(Teclas(3))
            mov = 3 : pintado = 0: moviendo = 1
        Elseif ((n bAND %10000) Or Multikeys(Teclas(4)))
            If DatosJ(jugador,EXTRACC) bAND %1
                snd128(4)
                fan(4,3,0)
                fan(4,3,0)
                fan(4,3,0)
                SilenciarAY()
                cambiaJugador()
                pintado=0
                mov = 4 : moviendo = 1
            End If
        Elseif Multikeys(KEYF)
            vivo=0
            jugador=0
        End If
    End If
END Sub

'Función de cambio de jugador
Sub cambiaJugador()
    Dim oldpantalla As UBYTE
    
    oldpantalla=pantalla
    
    DatosJ(jugador,PX)=x: DatosJ(jugador,PY)=y
    DatosJ(jugador,ORI)=orientacion
    
    setAttr(bP+2,1+jugador*29,57+jugador*2)
    jugador=(jugador+1) mod 2
    
    setAttr(bP+2,1+jugador*29,57+jugador*2+128)
    pantalla=Conex(DatosJ(jugador,PUNTPY),DatosJ(jugador,PUNTPX))
    
    x=DatosJ(jugador,PX): y=DatosJ(jugador,PY)
    orientacion=DatosJ(jugador,ORI)
    
    If pantalla<>oldpantalla
        PRINT USR TRANSIT
        imprPant2()
    Else
        border 0
    End If
END Sub




